package com.woniuxy.dynamic.jdk;

/**
 * @author 佘赛飞
 * @create 2021 -11 -15 3:34 PM
 */

import com.woniuxy.dynamic.aspect.LogForService;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkDynamic {

    //创建代理对象，这里就是动态生成代理后的对象的方法，

    /**
     * 获取代理好的代理对象
     *
     * @param targetClass 被代理的目标对象
     * @return
     */
    public Object getProxyObject(final Object targetClass) {
        /*
        newProxyInstance的第一个参数，类加载器，是哪个对象的类加载器？我要代理的那个对象的加载器
        使用匿名内部类的写法
         */
        Object o = Proxy.newProxyInstance(targetClass.getClass().getClassLoader(), targetClass.getClass().getInterfaces(),
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //直接写业务，这个就是方法体
                        //1、方法前增强
                        LogForService logForService = new LogForService();
                        logForService.beforeStrengthen();
                        //2、目标类的方法，他就相当于反射一个对象然后执行对象的方法
                        Object invoke = method.invoke(targetClass, args);
                        logForService.afterStrengthen();
                        return invoke;
                    }
                });
        return o;
    }
}